using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using Curriculum.UI.Enum;
using Curriculum.UI.Helper;
using Curriculum.UI.Test;
using Curriculum.UI.Clases.ManejadorControles;
using Curriculum.Business.Clases;
using Curriculum.Business.ClasesPersistentes;
using Curriculum.Business.Manejadores;





namespace Curriculum.UI
{
	/// <summary>
	/// Summary description for AntecedenteAgregacionABM.
	/// </summary>
	public class frmAntecedenteAgregacionABM : System.Windows.Forms.Form
	{
		private System.Windows.Forms.GroupBox groupBox2;
		private System.Windows.Forms.Button btnCancelar;
		private System.Windows.Forms.Button btnAceptar;
		private System.Windows.Forms.Panel pnlControles;
		//
		// referencia al formulario padre
		private Form m_InstanceRef = null;
		private TipoABM _tABM;
		private string _idAntecedente = string.Empty;
		private string _idAntecedentePersistente = string.Empty;
		private MasterData masterData=MasterData.GetInstancia();
		private VersionCurriculo versionCV;
		// esta lista la utilizo para cargar
		// los antecedentes de agregacion
		private AntecedentesPersistentes _listaAntecedentesPersistentes;
		private int locX=260;
		private int locY=16;
		private string charSeparator = "a";
		
		/// <summary>
		/// Required designer variable.
		/// </summary>
		private System.ComponentModel.Container components = null;

		public frmAntecedenteAgregacionABM(TipoABM tipoABM)
		{
			InitializeComponent();
			this._tABM = tipoABM;
		}

		/// <summary>
		/// Clean up any resources being used.
		/// </summary>
		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if(components != null)
				{
					components.Dispose();
				}
			}
			base.Dispose( disposing );
		}

		#region - Private Custom Methods -	
		
		#region - Cargar -
		
		private void CargarAntecedenteAControles(AntecedentePersistente aPersistente)
		{
			if(aPersistente.AtributosPersistentes!=null)
			{
				
				//IList atrPersistentes = aPersistente.AtributosPersistentes;
				AtributosPersistentes atrPersistentes = aPersistente.AtributosPersistentes;
				string ctrlName=string.Empty;
				Control ctrl = null;
				ManejadorControles mControles = null;
				foreach(AtributoPersistente atrPersistente in  atrPersistentes)
				{
					ctrlName = aPersistente.IdAntecedente + charSeparator + atrPersistente.IdAtributo;
					ctrl = FindControl(ctrlName,this);
					string tipoAtributo = masterData.ObtenerTipo((masterData.GetAtributo(atrPersistente.IdAtributo)).tipo);
					mControles = ManejadorControlesFactory.FactoryMethod(tipoAtributo);
					mControles.Cargar(ctrl,atrPersistente.Valor);
				}
			}
			// #TODO: este if no tendria que estar o puede darse el caso?
			if(aPersistente.AntecedentesPersistentes!=null)
			{
				//IList aPersistentes = aPersistente.AntecedentesPersistentes;
				AntecedentesPersistentes aPersistentes = aPersistente.AntecedentesPersistentes;
				foreach(AntecedentePersistente objAPersistente in aPersistentes)
				{
					CargarAntecedenteAControles(objAPersistente);					
				}
			}
		}

		private void CargarControlesAAntecedente(AntecedentePersistente aPersistente)
		{
			if(aPersistente.AtributosPersistentes!=null)
			{
				
				//IList atrPersistentes = aPersistente.AtributosPersistentes;
				AtributosPersistentes atrPersistentes = aPersistente.AtributosPersistentes;
				string ctrlName=string.Empty;
				Control ctrl = null;
				ManejadorControles mControles = null;
				foreach(AtributoPersistente atrPersistente in  atrPersistentes)
				{
					ctrlName = aPersistente.IdAntecedente + charSeparator +atrPersistente.IdAtributo;
					ctrl = FindControl(ctrlName,this);
					string tipoAtributo = masterData.ObtenerTipo((masterData.GetAtributo(atrPersistente.IdAtributo)).tipo);
					mControles = ManejadorControlesFactory.FactoryMethod(tipoAtributo);					
					atrPersistente.Valor = mControles.GetValor(ctrl);
				}
			}
			// #TODO: puede darse este caso?
			if(aPersistente.AntecedentesPersistentes!=null)
			{
				//IList aPersistentes = aPersistente.AntecedentesPersistentes;
				AntecedentesPersistentes aPersistentes = aPersistente.AntecedentesPersistentes;
				/*if(aPersistentes.Count>1)
				{
					CargarAntecedentesDelArbol	
				}*/
				foreach(AntecedentePersistente objAPersistente in aPersistentes)
				{
					CargarControlesAAntecedente(objAPersistente);					
				}
			}	
		}

		#endregion - Cargar -	

		#region - Construccion del Form -
	
		#region - AgregarControles -
		
		private void AgregarNombreAntecedente(string nombre)
		{
			locY+=10;
			Label lbl = new Label();
			lbl.Text = nombre;
			lbl.Font = new Font("Microsoft Sans Serif",12,FontStyle.Bold);
			lbl.Height = 20;
			lbl.Width = lbl.Text.Length * 20;
			lbl.TextAlign = ContentAlignment.MiddleRight;
			lbl.Location = new Point(locX - lbl.Width - 20,locY);					
			locY+=lbl.Height + 10;
			pnlControles.Controls.Add(lbl);			
		}
		
		private void AgregarAsterisco(Atributo objAtributo,int locX,int locY)
		{
			if(!objAtributo.Opcional)
			{
				Label lbl = new Label();
				lbl.Text = "*";
				lbl.ForeColor = Color.Red;
				lbl.Height = 20;
				lbl.Width = 20;
				lbl.TextAlign = ContentAlignment.MiddleRight;
				lbl.Location = new Point(locX,locY);
				pnlControles.Controls.Add(lbl);								
			}
		}
		
		private void AgregarControles(Antecedente antecedente)
		{
			if(antecedente.Atributos!=null)
			{
				AgregarNombreAntecedente(antecedente.Nombre);
				Atributo[] listaAtributos = antecedente.Atributos;
				ManejadorControles mControles = null;
				string separador = ":";
				foreach (Atributo objAtributo in listaAtributos)
				{
					string tipoAtributo = masterData.ObtenerTipo(objAtributo.IdTipoDato);
					Control ctrl = Helper.ControlFactoryHelper.GetControl(tipoAtributo);
					mControles = ManejadorControlesFactory.FactoryMethod(tipoAtributo);
					//le paso el IdAntecedente : IdAtributo
					mControles.Inicializar(ctrl,antecedente.IdAntecente + separador +objAtributo.IdAtributo);
					ctrl.Name = antecedente.IdAntecente + charSeparator + objAtributo.IdAtributo;
					ctrl.Location = new Point(locX,locY);
					ctrl.Width = 200;
					Label lbl = new Label();
					lbl.Text = objAtributo.Nombre + ":";
					lbl.Height = 20;
					lbl.Width = lbl.Text.Length * 8;
					lbl.TextAlign = ContentAlignment.MiddleRight;
					lbl.Location = new Point(locX - lbl.Width - 20,locY);
					pnlControles.Controls.Add(lbl);
					pnlControles.Controls.Add(ctrl);
					AgregarAsterisco(objAtributo,locX + ctrl.Width + 5,locY);
					locY += ctrl.Height + 5;
				}
			}
			if(antecedente.Antecedentes!=null)
			{
				Antecedente[] listaAntecedentes = antecedente.Antecedentes;
				foreach (Antecedente objAntecedente in listaAntecedentes)
				{
					AgregarControles(objAntecedente);
				}
			}								
		}
		
		#endregion - AgregarControles -

		private void CargarTituloFormulario()
		{
			switch(_tABM)
			{
				case TipoABM.ALTA:
					this.Text = "Alta - "+ this.Text;
					break;
				case TipoABM.BAJA:
					this.Text = "Baja - "+ this.Text;					
					break;
				case TipoABM.MODIFICACION:
					this.Text = "Modificacion - "+ this.Text;					
					break;
			}
		}

		
		private void ConstruirForm()
		{			
			//Tester test = Tester.Instance();
			//Antecedente estructura = test.EstructuraSoloTerciario();
			ManejadorAntecedentes mAntecedentes = ManejadorAntecedentes.GetInstancia();			
			Antecedente estructura = mAntecedentes.GetAntecedente(_idAntecedente);
			AgregarControles(estructura);
		}		

		#endregion - Construccion del Form -

		#region - FindControl -

		private System.Windows.Forms.Control FindControl(string ctrlName, System.Windows.Forms.Control owner) 
		{ 
			return Helper.FormHelper.FindControl(ctrlName,owner);
		} 
		
		#endregion - FindControl -

		#region - ABM Methods -

		private AntecedentePersistente GetAntecedentePersistente(string idAntecedentePersistente)
		{
			AntecedentePersistente auxAntecentePersistente = null;
			if(_listaAntecedentesPersistentes !=null)
			{
				foreach (AntecedentePersistente antPersistente in _listaAntecedentesPersistentes)
				{
					if(antPersistente.IdAntecedentePersistente == idAntecedentePersistente)
					{
						auxAntecentePersistente = antPersistente;
						break;
					}
				}				
			}
			return auxAntecentePersistente;
		}

		private AntecedentePersistente CrearAntecedentePersistenteNuevo()
		{
			ManejadorAntecedentesPersistentes mAntecedentesPersistentes = new ManejadorAntecedentesPersistentes();
			return mAntecedentesPersistentes.GetNuevoAntecedentePersistenteHoja(_idAntecedente);		
		}
		
		private void AgregarAntecedente(AntecedentePersistente aPersistente)
		{
/*			if(ListaAntecedentesPersistentes==null)
			{
				ListaAntecedentesPersistentes = new AntecedentesPersistentes();
			}*/
			ListaAntecedentesPersistentes.Add(aPersistente);							
		}
		
		private void Agregar()
		{
			if(_listaAntecedentesPersistentes==null)
			{
				_listaAntecedentesPersistentes = new AntecedentesPersistentes();	
				((AntecedenteABM)InstanceRef).ListaAntecedentesPersistentes = _listaAntecedentesPersistentes;
			}
			AntecedentePersistente antPersistente = CrearAntecedentePersistenteNuevo();
			// solo le cargo el id de antecedente
			antPersistente.IdAntecedente = _idAntecedente;
			CargarControlesAAntecedente(antPersistente);
			AgregarAntecedente(antPersistente);				
		}
		
		private void ActualizarListaAntecedentes(AntecedentePersistente aPersistente)
		{
			int i = 0;
			foreach(AntecedentePersistente antecedentesPersistente in _listaAntecedentesPersistentes)
			{
				if(antecedentesPersistente.IdAntecedentePersistente == aPersistente.IdAntecedentePersistente)
				{					
					// piso al antecedente q tiene el mismo id
					//ListaAntecedentesPersistentes.[i]=aPersistente;
					ListaAntecedentesPersistentes.SetPosition(i,aPersistente);
					break;
				}
				i++;
			}
		}

		private void Modificar()
		{			
			AntecedentePersistente antPersistente = CrearAntecedentePersistenteNuevo();
			antPersistente.IdAntecedente = _idAntecedente;
			antPersistente.IdAntecedentePersistente = _idAntecedentePersistente;
			CargarControlesAAntecedente(antPersistente);
			ActualizarListaAntecedentes(antPersistente);				
		}

		private void EliminarListaAntecedentes(string idAntecedentePersistente)
		{
			foreach(AntecedentePersistente antecedentesPersistente in _listaAntecedentesPersistentes)
			{
				if(antecedentesPersistente.IdAntecedentePersistente == idAntecedentePersistente)
				{
					// Borro el que estaba antes
					ListaAntecedentesPersistentes.Remove(antecedentesPersistente);
					break;
				}
			}
			/*if(ListaAntecedentesPersistentes.Count==0)
				ListaAntecedentesPersistentes = null;*/
		}		
		private void Eliminar()
		{
			EliminarListaAntecedentes(_idAntecedentePersistente);							
		}		
		private void Aceptar()
		{
			switch(_tABM)
			{
				case TipoABM.ALTA :
						Agregar();
					break;
				case TipoABM.MODIFICACION:
						Modificar();
					break;
				case TipoABM.BAJA:
						Eliminar();
					break;
			}
		}
		
		#endregion - ABM Methods -

		#region - InhabilitarControles -
		
		private void InhabilitarControles(AntecedentePersistente aPersistente)
		{
			if(aPersistente.AtributosPersistentes!=null)
			{			
				AtributosPersistentes atrPersistentes = aPersistente.AtributosPersistentes;
				string ctrlName=string.Empty;
				Control ctrl = null;
				foreach(AtributoPersistente atrPersistente in  atrPersistentes)
				{
					ctrlName = aPersistente.IdAntecedente + charSeparator + atrPersistente.IdAtributo;
					ctrl = FindControl(ctrlName,this);
					ctrl.Enabled = false;
				}
			}
			if(aPersistente.AntecedentesPersistentes!=null)
			{
				AntecedentesPersistentes aPersistentes = aPersistente.AntecedentesPersistentes;
				foreach(AntecedentePersistente objAPersistente in aPersistentes)
				{
					InhabilitarControles(objAPersistente);					
				}					
			}
		}

		#endregion - InhabilitarControles -

		#endregion - Private Custom Methods -	
		
		#region - Properties -

		public string IdAntecedente
		{
			get { return _idAntecedente; }
			set { _idAntecedente = value; }
		}

		public string IdAntecedentePersistente
		{
			get { return _idAntecedentePersistente; }
			set { _idAntecedentePersistente = value; }
		}

		public Form InstanceRef
		{
			get { return m_InstanceRef; }
			set { m_InstanceRef = value; }
		}

		public VersionCurriculo VersionCV
		{
			get { return versionCV; }
			set { versionCV = value; }
		}

		public AntecedentesPersistentes ListaAntecedentesPersistentes
		{
			get { return _listaAntecedentesPersistentes; }
			set { _listaAntecedentesPersistentes = value; }
		}

		#endregion - Properties -

		#region Windows Form Designer generated code
		/// <summary>
		/// Required method for Designer support - do not modify
		/// the contents of this method with the code editor.
		/// </summary>
		private void InitializeComponent()
		{
			System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(frmAntecedenteAgregacionABM));
			this.groupBox2 = new System.Windows.Forms.GroupBox();
			this.btnCancelar = new System.Windows.Forms.Button();
			this.btnAceptar = new System.Windows.Forms.Button();
			this.pnlControles = new System.Windows.Forms.Panel();
			this.groupBox2.SuspendLayout();
			this.SuspendLayout();
			// 
			// groupBox2
			// 
			this.groupBox2.Controls.Add(this.btnCancelar);
			this.groupBox2.Controls.Add(this.btnAceptar);
			this.groupBox2.Location = new System.Drawing.Point(0, 310);
			this.groupBox2.Name = "groupBox2";
			this.groupBox2.Size = new System.Drawing.Size(640, 60);
			this.groupBox2.TabIndex = 4;
			this.groupBox2.TabStop = false;
			// 
			// btnCancelar
			// 
			this.btnCancelar.Location = new System.Drawing.Point(552, 21);
			this.btnCancelar.Name = "btnCancelar";
			this.btnCancelar.Size = new System.Drawing.Size(72, 23);
			this.btnCancelar.TabIndex = 1;
			this.btnCancelar.Text = "&Cancelar";
			this.btnCancelar.Click += new System.EventHandler(this.btnCancelar_Click);
			// 
			// btnAceptar
			// 
			this.btnAceptar.Location = new System.Drawing.Point(16, 20);
			this.btnAceptar.Name = "btnAceptar";
			this.btnAceptar.Size = new System.Drawing.Size(75, 24);
			this.btnAceptar.TabIndex = 0;
			this.btnAceptar.Text = "&Aceptar";
			this.btnAceptar.Click += new System.EventHandler(this.btnAceptar_Click);
			// 
			// pnlControles
			// 
			this.pnlControles.AutoScroll = true;
			this.pnlControles.Location = new System.Drawing.Point(4, 0);
			this.pnlControles.Name = "pnlControles";
			this.pnlControles.Size = new System.Drawing.Size(632, 304);
			this.pnlControles.TabIndex = 5;
			// 
			// frmAntecedenteAgregacionABM
			// 
			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
			this.ClientSize = new System.Drawing.Size(640, 373);
			this.Controls.Add(this.pnlControles);
			this.Controls.Add(this.groupBox2);
			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
			this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
			this.MaximizeBox = false;
			this.Name = "frmAntecedenteAgregacionABM";
			this.ShowInTaskbar = false;
			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
			this.Text = "Antecedente";
			this.Load += new System.EventHandler(this.frmAntecedenteAgregacionABM_Load);
			this.groupBox2.ResumeLayout(false);
			this.ResumeLayout(false);

		}
		#endregion

		private void frmAntecedenteAgregacionABM_Load(object sender, System.EventArgs e)
		{
			CargarTituloFormulario();
			ConstruirForm();		
			AntecedentePersistente antecedentePersistente = GetAntecedentePersistente(_idAntecedentePersistente);
			// si no es un alta cargo los datos
			if(_tABM!=TipoABM.ALTA)
			{
				CargarAntecedenteAControles(antecedentePersistente);
			}	
			if(_tABM==TipoABM.BAJA)
			{
				InhabilitarControles(antecedentePersistente);
			}
		}

		private void btnAceptar_Click(object sender, System.EventArgs e)
		{
			Aceptar();
			((AntecedenteABM)m_InstanceRef).RefrescarArbol();
			this.Close();				
		}

		private void btnCancelar_Click(object sender, System.EventArgs e)
		{		
			this.Close();
		}
	}
}
